package q636_exclusiveTime;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;

public class Solution_1 {
    /*
    通过使用栈来模拟函数进出 栈中需要记录每个函数的idx以及开始运行时间
    遍历List 如果遇到start 首先判断栈中是否有函数 如果有函数 那么先将该函数的运行时间 + （当前time - 开始时间）
    然后将该函数的开始时间置为当前时间 意味着这个原栈顶函数被暂停
    而每次取出函数时 就计算当前时间减去所记录的时间戳
    注意 如果有一个函数运行时 另一个函数介入 那么首先是计算了第一个函数运行到介入的这段时间的
    然后介入函数出栈时 栈顶函数 也就是第一个函数的时间戳也被重置了 也就保证了是独占时间
     */
    public int[] exclusiveTime(int n, List<String> logs) {
        int[] res = new int[n];
        Deque<int[]> stack = new ArrayDeque<>(); // {idx, 开始运行的时间}
        for (String log : logs) {
            // 函数
            int idx = Integer.parseInt(log.substring(0, log.indexOf(':')));
            // 时间类型
            String type = log.substring(log.indexOf(':') + 1, log.lastIndexOf(':'));
            // 时间戳
            int timestamp = Integer.parseInt(log.substring(log.lastIndexOf(':') + 1));
            if ("start".equals(type)) {
                if (!stack.isEmpty()) {
                    res[stack.peek()[0]] += timestamp - stack.peek()[1];
                    stack.peek()[1] = timestamp;
                }
                stack.push(new int[] {idx, timestamp});
            } else {
                int[] func = stack.pop();
                res[func[0]] += timestamp - func[1] + 1;
                if (!stack.isEmpty()) {
                    stack.peek()[1] = timestamp + 1;
                }
            }
        }

        return res;
    }
}
